# 1.如果我们需要一个空列表，可以通过[]，或者list()方式来定义
list1 = []
list2 = list()
print(list1, type(list1))
print(list2, type(list2))

# 2. 列表的元素可以有多个，而且数据类型没有限制,允许有重复元素,并且是有序的
list3 = [100, "jack", 4.5, True]
print(list3)

# 嵌套列表
list4 = [100, "tom", ["天龙八部", "笑傲江湖", 300]]
print("list4 = ", list4)

# 3. 列表的索引下标是从0开始id

# 4.列表的索引下标必须在指定范围内使用 否则报 IndexError
list5 = [100, "tom", "jerry", "lucy"]
print(list5[0])  # 100
print(list5[1])  # tom
print(list5[2])  # jerry
print(list5[3])  # lucy
# print(list5[4])  # 这样会报错


# 5.索引也可以从尾部开始 依然不能越界
print(list5[-1])  # lucy
print(list5[-2])  # jerry
print(list5[-3])  # tom
print(list5[-4])  # 100

print("------------------------------------")
# 6.# 通过 列表[索引]=新值 对数据进行更新，使用 列表.append(值)方法来添加元素
# 初始化一个包含两部武侠小说名称的列表
list_a = ["天龙八部", "笑傲江湖"]
# 输出列表当前内容
print("list_a:", list_a)
# 修改列表中第一部小说的名称
list_a[0] = "雪山飞狐"
# 输出列表当前内容
print("list_a:", list_a)
# 向列表中添加一部新的武侠小说
list_a.append("倚天屠龙")
# 输出列表当前内容
print("list_a:", list_a)
# 删除列表中指定索引的小说
del list_a[1]
# 输出列表当前内容
print("list_a->", list_a)

print("------------------------------------")
# 7.列表是可变序列
# 列表的元素是可以修改的,修改后，列表变量指向地址不变，只是数据内容变化
# 变化后的数据内容就会指向一个新的内存空间
list6 = [100, 2.1, "java"]
print(f"list6 = {list6} 地址为：{id(list6)} || {list6[2]} {id(list6[2])}")
list6[2] = "python"
print(f"list6 = {list6} 地址为：{id(list6)} || || {list6[2]} {id(list6[2])}")

print("------------------------------------")
# 扩展列表在赋值时的特点
# 初始化一个包含不同类型元素的列表
list7 = [100, 2.1, "java"]
# list8引用list7的内存地址，因此对list8的修改会影响list7
list8 = list7
# 修改list8的第一个元素
list8[0] = 500
# 输出list7的当前状态，由于list7和list8指向同一内存地址，所以list7的内容也被修改了
print("list7=", list7)
# 输出list8的当前状态
print("list8=", list8)

print("------------------------------------")


# 定义一个函数f1，用于修改列表的第一个元素并展示列表的内存地址
# 参数：list - 输入的列表，预期为可变对象，如列表
# 无返回值
# 列表当作参数传递的时候传递的时列表的地址
def f1(list):
    list[0] = 100  # 修改列表的第一个元素为100
    print("list的id：", id(list))  # 打印列表的内存地址

# 初始化一个列表list10，包含三个整数
list10 = [1, 2, 3]
print("list10的id", id(list10))  # 在调用函数前，打印list10的内存地址

# 调用f1函数，传入list10
f1(list10)

# 再次打印list10的内容，观察变化
print("list10", list10)
